From: Boris Ostrovsky Date: Fri, 25 Aug 2017 12:07:12 +0000 (+0200) Subject: x86/hvm: vmx/svm_cpu_up_prepare should be called only once X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~1609 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=91b80133291c11db957f2b122d3d812b8d504f7a;p=xen.git x86/hvm: vmx/svm_cpu_up_prepare should be called only once These routines are first called via CPU_UP_PREPARE notifier by the BSP and then by the booting ASP from vmx_cpu_up()/_svm_cpu_up(). Avoid the unnecessary second call. Because BSP doesn't go through CPU_UP_PREPARE it is a special case. We pass 'bsp' flag to newly added _vmx_cpu_up() (just like it's already done for _svm_cpu_up()) so they can decide whether or not to call vmx/svm_cpu_up_prepare(). Reported-by: Andrew Cooper Signed-off-by: Boris Ostrovsky Reviewed-by: Jan Beulich Reviewed-by: Kevin Tian --- diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 599a8d3292..6b19b162f8 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -1574,7 +1574,7 @@ static int _svm_cpu_up(bool bsp) return -EINVAL; } - if ( (rc = svm_cpu_up_prepare(cpu)) != 0 ) + if ( bsp && (rc = svm_cpu_up_prepare(cpu)) != 0 ) return rc; write_efer(read_efer() | EFER_SVME); diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c index 7854802cba..86cd316cfb 100644 --- a/xen/arch/x86/hvm/vmx/vmcs.c +++ b/xen/arch/x86/hvm/vmx/vmcs.c @@ -603,7 +603,7 @@ void vmx_cpu_dead(unsigned int cpu) vmx_pi_desc_fixup(cpu); } -int vmx_cpu_up(void) +int _vmx_cpu_up(bool bsp) { u32 eax, edx; int rc, bios_locked, cpu = smp_processor_id(); @@ -652,7 +652,7 @@ int vmx_cpu_up(void) INIT_LIST_HEAD(&this_cpu(active_vmcs_list)); - if ( (rc = vmx_cpu_up_prepare(cpu)) != 0 ) + if ( bsp && (rc = vmx_cpu_up_prepare(cpu)) != 0 ) return rc; switch ( __vmxon(this_cpu(vmxon_region)) ) @@ -693,6 +693,11 @@ int vmx_cpu_up(void) return 0; } +int vmx_cpu_up() +{ + return _vmx_cpu_up(false); +} + void vmx_cpu_down(void) { struct list_head *active_vmcs_list = &this_cpu(active_vmcs_list); diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 67fc85b201..f6da119c9f 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2433,7 +2433,7 @@ const struct hvm_function_table * __init start_vmx(void) { set_in_cr4(X86_CR4_VMXE); - if ( vmx_cpu_up() ) + if ( _vmx_cpu_up(true) ) { printk("VMX: failed to initialise.\n"); return NULL; diff --git a/xen/include/asm-x86/hvm/vmx/vmcs.h b/xen/include/asm-x86/hvm/vmx/vmcs.h index e3faf7807f..8fb9e3ceee 100644 --- a/xen/include/asm-x86/hvm/vmx/vmcs.h +++ b/xen/include/asm-x86/hvm/vmx/vmcs.h @@ -26,6 +26,7 @@ extern void setup_vmcs_dump(void); extern int vmx_cpu_up_prepare(unsigned int cpu); extern void vmx_cpu_dead(unsigned int cpu); extern int vmx_cpu_up(void); +extern int _vmx_cpu_up(bool bsp); extern void vmx_cpu_down(void); struct vmcs_struct {